#!/usr/bin/python

import sympy
import utils
import copy
n, e = sympy.var('n e')
z = sympy.var('z0 z1 z2 z3 z4 z5 z6 z7')

eta=((2*e)**2*(n+2)/2/(n+8)**2*
     (1+(2*e)/4/(n+8)**2*(-n*n+56*n+272) 
     +(2*e)**2/16/(n+8)**4*(-5*n**4-230*n**3+1124*n**2+17920*n+46144-384*(n+8)*(5*n+22)*z[3])
     -(2*e)**3/64/(n+8)**6*(13*n**6+946*n**5+27620*n**4+121472*n**3-262528*n**2-2912768*n-5655552
                           -z[3]*((n+8)*16*(n**5+10*n**4+1220*n**3-1136*n**2-68672*n-171264))
                           +z[4]*((n+8)**3*1152*(5*n+22))
                           -z[5]*((n+8)**2*5120*(2*n**2+55*n+186))
                           )
                                                                                                                               
      )
     )
zeta=sympy.special.zeta_functions.zeta
eta_z=eta.subs(e,e/2)
for i in range(len(z)):
    eta_z=eta_z.subs(z[i], zeta(i))

print eta_z
eta_zf=eta.subs(e,e/2)
for i in range(len(z)):
    eta_zf=eta_zf.subs(z[i], zeta(i).evalf())

print "\n\n ZF"
eta_zf=eta_zf/(n+2)
for i in range(1,7):
   print i-1, "  ", (eta_zf.subs(e,0)*(n+8)**(2*i-4)).evalf().series(n,0,8)
   eta_zf = eta_zf.diff(e)/i

print "\n\n"

eta_n1=eta_z.subs(n, 1)
print eta_n1.evalf()



N=sympy.var('N')
eta_1n=eta_z.subs(n,1/N)
print
print eta_1n.series(N,0,10).evalf()
print

w=((2*e)- (2*e)**2/(n+8)**2*(9*n+42)
   +(2*e)**3/4/(n+8)**4*(33*n**3+538*n**2+4288*n+9568+96*(n+8)*(5*n+22)*z[3])
   -(2*e)**4/16/(n+8)**6*(-5*n**5+1488*n**4+46616*n**3+419528*n**2+1750080*n+2599552
                          +z[3]*96*(n+8)*(63*n**3+548*n**2+1916*n+3872)
                          -z[4]*288*(n+8)**3*(5*n+22)
                          +z[5]*1920*(n+8)**2*(2*n**2+55*n+186))  #n**2?  
   +(2*e)**5/64/(n+8)**8*(13*n**7+7196*n**6+240328*n**5+3760776*n**4+38877056*n**3+223778048*n**2+660389888*n+752420864
                          -z[3]*(n+8)*16*(9*n**6-1104*n**5-11648*n**4-243864*n**3-2413248*n**2-9603328*n-14734080)
                          -(z[3])**2*(n+8)**2*768*(6*n**4+107*n**3+1826*n**2+9008*n+8736)
                          -z[4]*(n+8)**3*288*(63*n**3+548*n**2+1916*n+3872)
                          +z[5]*(n+8)**2*256*(305*n**4+7386*n**3+45654*n**2+143212*n+226992)
                          -z[6]*(n+8)**4*9600*(2*n**2+55*n+186)
                          +z[7]*(n+8)**3*112896*(14*n**2+189*n+526)
                          )
   )
w_n1=w.subs(n, 1)

for i in range(len(z)):
    w_n1=w_n1.subs(z[i], zeta(i))

print
w_n1=w_n1.subs(e, e/2)
print w_n1.evalf()

w_1n=w.subs(n,1/N).subs(e,e/2)
for i in range(len(z)):
    w_1n=w_1n.subs(z[i], zeta(i))

print w_1n.series(N,0,4).evalf()


print
print
import sys
sys.exit(0)

r_str=""
for i in range(94):
    r_str+="r%s "%i
r=sympy.var(r_str)

g4=-4*( 
       r[10]*(-2./3.*6 -5./6.*3./2.+5./2.*6+(5./2.-2*zeta(3))*6) 
       +r[11]*(-1./2.*3./2. -2./3.*3+(2*zeta(3)-1)*3./2.)
       +r[12]*(zeta(3)-5./6.)*3./2.
       +r[13]*((1./2.-zeta(3))*3./2.+(11./6.-zeta(3))*3./2.+(zeta(3)-5./6.)*3 )
       +r[14]*(2*zeta(3)-2)*3./8.
       +r[1]*r[2]**2*(-7/12.*3./4.)
       +r[1]*r[3]*(-121./96*1 + 37/96.*1)
       +r[2]*r[3]*((3*zeta(3)-3./2.*zeta(4))*6 + (3*zeta(3)+3./2.*zeta(4))*3.)
       +r[8]*(10*zeta(5)*3)
       +r[9]*((1/2.-zeta(3))*3./4.)
       )

g2=-4*(
       r[1]*r[4]*5./16.*1./8.
       +r[1]**2*5./16.*1./12.
       +r[1]*r[3]*(-13./48*1./4.-2./3.*1./4.)
       )
       
#print g4-2*g2
#print (g4-2*g2).evalf()

r_map={
   n+2                          :   r[1]*3,  
   n+8                          :   r[2]*9,
   5*n+22                       :   r[3]*27, 
   n*n+6*n+20                   :   r[4]*27, 
   3*n*n+22*n+56                :   r[5]*81, 
   n*n+20*n+60                  :   r[6]*81, 
   n*n*n+8*n*n+24*n+48          :   r[7]*81, 
   
   2*n**2 + 55*n + 186                  :   r[8]*243, 
   3*n**3 + 24*n**2 + 80*n + 136        :   r[9]*243, 
   7*n**2 + 72*n + 164                  :   r[10]*243, 
   11*n**2 + 76*n + 156                 :   r[11]*243, 
   n**3 + 10*n**2 + 72*n + 160          :   r[12]*243, 
   n**3 + 14*n**2 + 76*n + 152          :   r[13]*243, 
   n**3 + 18*n**2 + 80*n + 144          :   r[14]*243,        
   n**4 + 10*n**3 + 40*n**2 + 80*n + 112:   r[15]*243, 

   14*n**2 + 189*n + 526                    : r[16]*729, 
   19*n**2 + 206*n + 504                    : r[17]*729,        
   n**3 + 26*n**2 + 210*n + 492             : r[18]*729,
   n**3 + 32*n**2 + 224*n + 472             : r[19]*729,
   n**3 + 36*n**2 + 244*n + 448             : r[20]*729,
   n**3 + 44*n**2 + 252*n + 432             : r[21]*729,  
   3*n**3 + 38*n**2 + 224*n + 464           : r[22]*729, 
   3*n**3 + 42*n**2 + 244*n + 440           : r[23]*729, 
   3*n**3 + 50*n**2 + 252*n + 424           : r[24]*729, 
   5*n**3 + 56*n**2 + 252*n + 416           : r[25]*729, 
   5*n**3 + 64*n**2 + 260*n + 400           : r[26]*729, 
   9*n**3 + 76*n**2 + 260*n + 384           : r[27]*729,       
   n**4 + 16*n**3 + 88*n**2 + 256*n + 368   : r[28]*729,
   n**4 + 16*n**3 + 96*n**2 + 264*n + 352   : r[29]*729,       
   n**4 + 12*n**3 + 68*n**2 + 248*n + 400   : r[30]*729,
   n**4 + 12*n**3 + 76*n**2 + 256*n + 384   : r[31]*729,
   3*n**4 + 30*n**3 + 120*n**2 + 256*n + 320: r[32]*729,        

   53*n**2 + 598*n + 1536                               : r[33]*2187,
   n**3 + 65*n**2 + 619*n + 1502                        : r[34]*2187,       
   2*n**3 + 76*n**2 + 643*n + 1466                      : r[35]*2187, 
   2*n**3 + 87*n**2 + 674*n + 1424                      : r[36]*2187,
   2*n**3 + 89*n**2 + 668*n + 1428                      : r[37]*2187,
   2*n**3 + 97*n**2 + 708*n + 1380                      : r[38]*2187,       
   3*n**3 + 78*n**2 + 630*n + 1476                      : r[39]*2187,
   4*n**3 + 111*n**2 + 716*n + 1356                     : r[40]*2187,
   5*n**3 + 100*n**2 + 678*n + 1404                     : r[41]*2187,
   5*n**3 + 110*n**2 + 712*n + 1360                     : r[42]*2187,       
   7*n**3 + 114*n**2 + 686*n + 1380                     : r[43]*2187,
   7*n**3 + 124*n**2 + 720*n + 1336                     : r[44]*2187,
   7*n**3 + 136*n**2 + 748*n + 1296                     : r[45]*2187,
   9*n**3 + 138*n**2 + 728*n + 1312                     : r[46]*2187, 
   9*n**3 + 150*n**2 + 756*n + 1272                     : r[47]*2187,
   9*n**3 + 158*n**2 + 796*n + 1224                     : r[48]*2187,
   9*n**3 + 174*n**2 + 812*n + 1192                     : r[49]*2187,       
   11*n**3 + 128*n**2 + 680*n + 1368                    : r[50]*2187, 
   11*n**3 + 148*n**2 + 748*n + 1280                    : r[51]*2187, 
   13*n**3 + 150*n**2 + 728*n + 1296                    : r[52]*2187, 
   13*n**3 + 162*n**2 + 756*n + 1256                    : r[53]*2187, 
   13*n**3 + 170*n**2 + 796*n + 1208                    : r[54]*2187, 
   13*n**3 + 186*n**2 + 812*n + 1176                    : r[55]*2187, 
   15*n**3 + 164*n**2 + 736*n + 1272                    : r[56]*2187, 
   17*n**3 + 182*n**2 + 796*n + 1192                    : r[57]*2187, 
   17*n**3 + 198*n**2 + 812*n + 1160                    : r[58]*2187, 
   21*n**3 + 226*n**2 + 828*n + 1112                    : r[59]*2187, 
   29*n**3 + 250*n**2 + 828*n + 1080                    : r[60]*2187,  
   3*n**4 + 36*n**3 + 204*n**2 + 744*n + 1200           : r[61]*2187,
   3*n**4 + 36*n**3 + 228*n**2 + 800*n + 1120           : r[62]*2187,
   3*n**4 + 40*n**3 + 232*n**2 + 760*n + 1152           : r[63]*2187,
   3*n**4 + 40*n**3 + 240*n**2 + 800*n + 1104           : r[64]*2187,
   3*n**4 + 40*n**3 + 256*n**2 + 816*n + 1072           : r[65]*2187,
   3*n**4 + 44*n**3 + 268*n**2 + 816*n + 1056           : r[66]*2187,
   3*n**4 + 44*n**3 + 284*n**2 + 832*n + 1024           : r[67]*2187,
   3*n**4 + 48*n**3 + 280*n**2 + 816*n + 1040           : r[68]*2187,
   3*n**4 + 52*n**3 + 308*n**2 + 832*n + 992            : r[69]*2187,
   5*n**4 + 62*n**3 + 304*n**2 + 808*n + 1008           : r[70]*2187,
   5*n**4 + 62*n**3 + 320*n**2 + 824*n + 976            : r[71]*2187,
   9*n**4 + 90*n**3 + 368*n**2 + 808*n + 912            : r[72]*2187,       
   n**4 + 14*n**3 + 144*n**2 + 724*n + 1304             : r[73]*2187,
   n**4 + 14*n**3 + 164*n**2 + 792*n + 1216             : r[74]*2187,
   n**4 + 14*n**3 + 180*n**2 + 808*n + 1184             : r[75]*2187,
   n**4 + 18*n**3 + 156*n**2 + 724*n + 1288             : r[76]*2187,
   n**4 + 18*n**3 + 168*n**2 + 752*n + 1248             : r[77]*2187,
   n**4 + 18*n**3 + 176*n**2 + 792*n + 1200             : r[78]*2187,
   n**4 + 22*n**3 + 180*n**2 + 752*n + 1232             : r[79]*2187,
   n**4 + 22*n**3 + 204*n**2 + 808*n + 1152             : r[80]*2187,
   n**4 + 26*n**3 + 196*n**2 + 740*n + 1224             : r[81]*2187,
   n**4 + 26*n**3 + 208*n**2 + 768*n + 1184             : r[82]*2187,
   n**4 + 26*n**3 + 216*n**2 + 808*n + 1136             : r[83]*2187,
   n**4 + 26*n**3 + 232*n**2 + 824*n + 1104             : r[84]*2187,
   n**4 + 30*n**3 + 228*n**2 + 808*n + 1120             : r[85]*2187,
   n**4 + 30*n**3 + 244*n**2 + 824*n + 1088             : r[86]*2187,
   n**5 + 14*n**4 + 84*n**3 + 312*n**2 + 784*n + 992    : r[87]*2187,
   n**5 + 14*n**4 + 92*n**3 + 336*n**2 + 784*n + 960    : r[88]*2187,
   n**5 + 14*n**4 + 92*n**3 + 352*n**2 + 800*n + 928    : r[89]*2187,
   n**5 + 18*n**4 + 120*n**3 + 400*n**2 + 784*n + 864   : r[90]*2187,
   n**5 + 18*n**4 + 120*n**3 + 416*n**2 + 800*n + 832   : r[91]*2187, 
   3*n**5 + 36*n**4 + 180*n**3 + 480*n**2 + 752*n + 736 : r[92]*2187
   }
   
rr_map=dict()
for rn in r_map:
    f,  r_=r_map[rn].args
#    print r_,  f
    rr_map[r_]=rn/f

#print rr_map[r[1]]
gG=(-g4-2*g2)*3888
for r_ in rr_map:
    gG=gG.subs(r_, rr_map[r_])
    
print gG
print
print gG.evalf()
print


print
print gG.series(n, 0, 10)
print


print utils.series_f(gG, n, 10)
print utils.series_f(gG, n, 10).subs(n, 1)
